//
// Created by Zhang on 2021/2/25.
//
#include <stdio.h>
//声明外部函数
#include "./sum.c"
/**
 * 函数和变量
 *
 * 要将所有实现的内容放到主函数中是不实际的，这样不仅程序格式不清晰，而且功能分类也不清晰。一个C程序是由一个或多个函数组成的，
 * 但只能有一个主函数，所以将一个较大的程序分解成若干个小程序模块是非常必要的，这些特定的功能单一的小模块就是函数，这样每个函数
 * 各自分工明确，可以精简程序代码，减少重复工作，优化程序结构。
 *
 * 注意：被调用函数要写在调用函数的上面，否则需要进行声明
 *
 * 全局变量：作用是从定义它的位置开始到本程序的文件末止，除了在函数外定义全局变量外，还有很多存储机制，如extern，static等
 * 就可以用来声明外部变量，以扩展外部变量的作用域；
 *
 * extern变量--扩展变量的作用域
 * 在一个文件中有一个全局变量定义在函数之后，可以使用extern来声明这个变量，扩展变量的作用域
 *
 * auto变量
 * 在定义局部变量时，一般常用的都是将变量直接定义为某个类型。并没有指定相应的存储类别，这是系统默认将该存储类型定为auto类型。
 *
 * register变量--寄存器变量
 * 使用register声明的变量是在CPU的寄存器中分配空间的，而auto变量是在内存中分配空间的。
 *
 * static变量--惊天局部变量
 * 在定义局部变量时前面的存储类型定义为static，这时这个变量就变为静态局部变量了，静态局部变量在内存的静态存储区中占永久的存储单元，
 * 即使在函数调用结束后也不消失且保留原值.
 */

//全局变量
int mm, nn;

void print(char str[]) {
    puts(str);
}

int sum(int a, int b) {
    print("函数的嵌套调用");
    return a + b;
}

int main() {
    mm = 10;
    nn = 20;
    //局部变量
    int i = sum(mm, nn);
    printf("%d\n", i);

    register int res = 1;
    printf("寄存器变量：%d\n", res);

    static int sta = 2;
    printf("静态变量：%d\n", sta);

    //使用extern可以把定义在函数后面的变量引用过来
    extern int x, y;
    printf("求和：%d\n", x + y + sum_1 + sum_2);

    //引用外部函数
    sumTest();
}

int x = 2, y = 3;